#include "Blockqueue.hpp"

using func_t = std::function<void(void)>;

void download()
{
    std::cout << "正在执行download任务!" << std::endl;
}

// 因为是单线程模式，所以无需互斥锁。
void* produce(void* argv)
{
    Blockqueue<func_t>* ptr = static_cast<Blockqueue<func_t>*> (argv);

    while(true)
    {
        std::cout << "生产任务" << std::endl;
        ptr->Enqueue(download);
        sleep(1);
    }
    
    return nullptr;
}

void* consume(void* argv)
{
    Blockqueue<func_t>* ptr = static_cast<Blockqueue<func_t>*> (argv);

    func_t f;

    while(true)
    {
        std::cout << "取出任务" << std::endl;
        ptr->Pop(&f);
        std::cout << "正在执行任务" << std::endl;
        f();
        sleep(1);
    }

    return nullptr;
}

int main()
{
    pthread_t pro,con;

    Blockqueue<func_t> bq;

    pthread_create(&pro,nullptr,produce,&bq);
    pthread_create(&con,nullptr,consume,&bq);

    pthread_join(pro,nullptr);
    pthread_join(con,nullptr);

    return 0;
}